// JS 引用数据类型： 对象（数组、函数、普通对象）
// 普通对象
// const obj={}; // ===> new Object()

// 数组类型

const arr:number[] = [1,2,3];
const arr2:Array<number> = [1,2,3]; // 泛型写法
const arr3:Array<string> = ['1','2','3'];

arr.push(4);
// arr.push('xx') // 报错
// arr.toFiexed(2);
// arr.push('xxxx')

const data = [1,'2',true]
data.push('xxxx')
data.push(true)
data.push(123)
let data2=data[1];


// 对象类型

// 定一个学生对象 姓名 班级 阶段 年龄

let  stud1:object = {
    name:'张三',
    age:18,
    grade:'一班',
    stage:'高中'
}
// object类型表示的是非原始类型(非基本数据类型)，使用object标注的变量不能直接访问属性或者设置属性
// console.log(stud1.name)
// stud1.name = '李四'

// stud1 = '张三' // 报错
stud1 = [1,2,3]
stud1 = function(){}
stud1 = new String('xxxx')

const stu:{name:string,age:number,grade:string,stage:string} = {
    name:'张三',
    age:18,
    grade:'一班',
    stage:'高中'
}

stu.name = '张三1'
console.log(stu.age)
// stu.name.toFixed(2) // 报错

// 可以把某个类型赋值给一个变量
// 这个变量就叫做类型别名
type StudentType = {name:string,age:number,grade:string,stage:string}

const stu2:StudentType = {
    name:'张三',
    age:18,
    grade:'一班',
    stage:'高中'
}

// 函数类型
// 函数： 函数名  参数  返回值

function sum(a:number,b:number):number{
    return a+b
}

sum(1,2)

// 匿名函数的参数类型：会进行类型推导

const names = ['张三','李四','王五']
names.forEach(function(item){
    item.toUpperCase()
    // item = 123 // 报错
})

type UserType = {
    name:string,
    age:number,
    sex?:string
}
const user:UserType={
    name:'张三',
    age:18
}
// 获取一个圆的面积 r*r*π
function getCircleArea(r:number,PI?:number):number{
    if(!PI){
        PI = 3.14
    }
    return r*r*PI
}

getCircleArea(10);
getCircleArea(10,3.141592653589793);

// 函数类型：函数的签名 (参数1:类型，参数2：类型....)=>返回值类型

type CalcType = (n1:number,n2:number)=>number
// 需求：我要开发一个计算器 可以实现加减乘除或者一些复杂的功能，并且要求具体的计算逻辑是由外部传入的
function calc(a:number,b:number,fn:CalcType):number{
    return fn(a,b)
}
const myfn:CalcType=function(n1,n2){
    return n1-n2
}

calc(1,2,myfn)


export {}